package net.bwie.realtime.dy.dwd.log.funcation.zl.usercountfuncation;

import net.bwie.realtime.dy.dwd.log.bean.TikTokBean;
import org.apache.flink.api.common.functions.AggregateFunction;

/**
 * @ClassName：UserCountAggregator
 * @Author: ZddddQ
 * @Date: 2025/5/28 18:59
 * @Description: 必须描述类做什么事情, 实现什么功能
 */
public class UserCountAggregator
        implements AggregateFunction<TikTokBean, Integer, Integer> {

    @Override
    public Integer createAccumulator() {
        return 0;  // 初始用户数为0
    }

    @Override
    public Integer add(TikTokBean bean, Integer accumulator) {
        // 根据事件类型安全更新用户数（防止出现负数）
        switch (bean.getEventType()) {
            case "enter":
                return accumulator + 1;
            case "leave":
                // 只有当用户数大于0时才减少
                return accumulator > 0 ? accumulator - 1 : 0;
            default:
                return accumulator;  // 忽略其他事件
        }
    }

    @Override
    public Integer getResult(Integer accumulator) {
        // 确保最终结果非负
        return Math.max(accumulator, 0);
    }

    @Override
    public Integer merge(Integer a, Integer b) {
        // 合并时也确保非负
        return Math.max(a + b, 0);
    }
}